package com.zoo.diannaopeijian.service.impl;

import com.zoo.diannaopeijian.common.util.CheckUtil;
import com.zoo.diannaopeijian.domain.PurchaseItem;
import com.zoo.diannaopeijian.domain.PurchaseRecord;
import com.zoo.diannaopeijian.domain.Stock;
import com.zoo.diannaopeijian.service.PurchaseItemService;
import com.zoo.diannaopeijian.service.PurchaseRecordService;
import com.zoo.diannaopeijian.service.PurchaseService;
import com.zoo.diannaopeijian.service.StockService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 进货服务实现类
 */
@Service
public class PurchaseServiceImpl implements PurchaseService {
    @Resource
    private PurchaseItemService purchaseItemService;
    @Resource
    private PurchaseRecordService purchaseRecordService;
    @Resource
    private StockService stockService;

    @Transactional
    @Override
    public boolean purchaseWares(Integer staffId, List<PurchaseItem> purchaseItemList) {
        if (CheckUtil.nullCheck(staffId, purchaseItemList)) {
            return false;
        }

        // 创建入货记录时间
        PurchaseRecord purchaseRecord = new PurchaseRecord();
        purchaseRecord.setStaffId(staffId);
        purchaseRecord.setPurRecTime(new Date());

        boolean result = purchaseRecordService.insertPurchaseRecord(purchaseRecord);

        if (StringUtils.isEmpty(purchaseRecord.getPurRecId())) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }

        List<Stock> stocks = new ArrayList<>();
        // 入货记录项插入入货记录id，建立关系，同时创建库存对象
        for (PurchaseItem item : purchaseItemList) {
            item.setPurRecId(purchaseRecord.getPurRecId());
            stocks.add(Stock.buildStock(item));
        }

        result = result && purchaseItemService.insertPurchaseItems(purchaseItemList);

        // 修改库存
        result = result && stockService.increaseStocks(stocks);

        if (!result) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }

        return result;
    }

    @Transactional
    @Override
    public boolean rePurchaseWares(List<PurchaseItem> purchaseItemList, Integer purchaseRecordId) {
        if (CheckUtil.nullCheck(purchaseItemList, purchaseRecordId)) {
            return false;
        }

        // 删除原本的进货项
        PurchaseItem purchaseItem = new PurchaseItem();
        purchaseItem.setPurRecId(purchaseRecordId);
        List<PurchaseItem> itemsBeDelete = purchaseItemService.deletePurchaseItem(purchaseItem);

        boolean result = true;

        // 修改库存
        // 构造要修改的库存对象
        List<Stock> stocks = new ArrayList<>();
        for (PurchaseItem item : itemsBeDelete) {
            stocks.add(Stock.buildStock(item));
        }
        result = result && stockService.reduceStocks(stocks);

        // 插入入货记录项
        result = result && purchaseItemService.insertPurchaseItems(purchaseItemList);

        // 修改库存
        stocks.clear();
        for (PurchaseItem item : purchaseItemList) {
            stocks.add(Stock.buildStock(item));
        }
        result = result && stockService.increaseStocks(stocks);

        if (!result) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }

        return result;
    }
}
